package com.example.demo_yunpan.mapper;

import com.example.demo_yunpan.entity.file;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;


import java.io.File;
import java.util.List;

@Mapper
@Repository
public interface FileMapper {


    /**根据文件名和当前路径找到对应的文件ID
     * @param fileName 文件名
     * @param hdfsPath hdfs路径
     * @return 文件ID
     */
    @Select("SELECT file_id FROM file WHERE fileName = #{fileName} AND hdfsPath = #{hdfsPath}")
    String getFileIdByFileNameAndPath(String fileName, String hdfsPath);

    /**
     * 插入文件记录
     * @param file 文件记录对象
     * @return 插入记录的数量
     */
    @Insert("INSERT INTO file (file_name, folder_id, folder_name, file_type, user_id, Create_time, file_size, hdfs_Path, mark, parent_Hdfs) VALUES (#{file.fileName}, #{file.folderId}, #{file.folderName}, #{file.filetype}, #{file.userId}, NOW(), #{file.fileSize}, #{file.hdfsPath}, #{file.mark},#{file.parentHdfs})")
    @Options(useGeneratedKeys = true, keyProperty = "fileId")
    int insertFile(@Param("file")file file);

    /**
     * 根据文件ID查询文件记录
     * @param fileId 文件ID
     * @return 文件记录对象
     */
    @Select("SELECT * FROM file WHERE file_id = #{fileId}")
    File getFileById(int fileId);

    /**
     * 根据文件ID查询文件名
     * @param fileId 文件ID
     * @return 文件记录对象
     */
    @Select("SELECT file_name FROM file WHERE file_id = #{fileId}")
    String getFileNameById(int fileId);

    /**
     * 根据hdfs路径查询文件记录
     * @param hdfsPath hdfs路径
     * @return 文件记录对象列表
     */
    @Select("SELECT * FROM file WHERE hdfsPath = #{hdfsPath}")
    List<File> getFileByHdfsPath(String hdfsPath);

    /**
     * 更新文件记录
     * @param file 文件记录对象，包含需要更新的字段
     * @return 更新记录的数量
     */
    @Update("UPDATE file SET file_name = #{file.fileName}, folder_id = #{file.folderId}, folder_name = #{file.folderName}, file_type = #{file.fileType}, user_id = #{file.userId}, file_size = #{file.fileSize}, hdfsPath = #{file.hdfsPath}, mark = #{file.mark} WHERE file_id = #{file.fileId}")
    int updateFile(File file);

    /**
     * 根据文件ID删除文件记录
     * @param fileId 文件ID
     * @return 删除记录的数量
     */
    @Delete("DELETE FROM file WHERE file_id = #{fileId}")
    int deleteFileById(int fileId);

    /**
     * 更改文件回收站标志为false
     * @param fileId
     * return
     * */
    @Update("UPDATE file SET mark = 0 WHERE file_id = #{fileId}")
    boolean upFileMarkFalse(String fileId);

    /**
     * 更改文件回收站标志为true
     * @param fileId
     * return
     * */
    @Update("UPDATE file SET mark = 1 WHERE file_id = #{fileId}")
    boolean upFileMarkTrue(String fileId);

    /**
     * 根据文件ID和目录查询
     * @param userId,path
     * */
    @Select("select * from file WHERE user_id = #{userId} and parent_hdfs = #{path}")
    List<file> findFileByUserId(@Param("userId")String userId,@Param("path")String path);

    @Select("<script>"+
            "select * from file where user_id = #{userId}\n" +
            "        <if test=\"fileNameFuzzy != null and fileNameFuzzy != ''\">\n" +
            "            and file_name like CONCAT('%', #{fileNameFuzzy}, '%')\n" +
            "        </if>\n" +
            "        <if test=\"category != null and category != ''\">\n" +
            "            and file_type like CONCAT('%', #{category}, '%')\n" +
            "        </if>"+
            "</script>")
    List<file> selectAllByuserId(@Param("userId") String userId,@Param("fileNameFuzzy")String fileNameFuzzy,@Param("category")String category);

    /**
     * 查询同一级下是否存在重复的文件名
     * @param Name
     * @param folderName
     * return 查询结果
     * */
    @Select("<script>" +
            "select * from file where file_Name = #{fileName} " +
            "        <if test=\"folderName != null\">\n" +
            "            and folder_name = #{folderName}\n" +
            "        </if>"+
            "</script>")
    file selectFileByName(@Param("folderName")String folderName,@Param("fileName")String Name);
    /**
     * 根据文件ID查看文件路径
     * @param fileId
     * @return
     */
    @Select("SELECT hdfs_Path FROM file WHERE file_id = #{fileId}")
    String getHdfsPathByFileId(int fileId);
}

